"""
字典是一种映射类型，
它的元素是键值对的，
字典的键必须为不可变类型(元组，字符串，数字)，
且不能重复。
A.字符串的创建方式:
         1.直接创建 '{}'
         2.使用dict()
B.空字典
"""
a = {
    '姓名': '不吃鱼',
    15: 18,
    (10, 20, 30): '11'
}
print(a)

b = dict((['年龄', 20], ['爱好', 'volleybal']))
print(b)  # dict-将list转化成dict

# 空字典(一个大括号表示空字典)-{}
# 空集合--set()

print('----------------------------------------------------')

"""
字典的增删改查
"""
x = {
    '姓名': '芥兰',
    '年龄': '18',
}
# 增加键值对
# x['爱好']
# print(x)

# 删除操作
# del x['年龄']
# print(x)

# 修改值操作
# x['年龄'] = 20
# print(x)

# 查找
print(x['姓名'])

print('----------------------------------------------------')

"""
1.get--用'键'查找'值'，若为不存在的键，则输出None(就是以默认值返回)
"""
y = {'姓名': '姚期智',
     '奖项': {'奖项一': '图灵奖',
              '奖项二': '波里亚奖'}
     }
y1 = y.get('奖项')
y2 = y.get('年龄')
y3 = y.get('领域', '计算机应用')  # 可以用get()直接赋予键对值
print(y1)
print(y2)
print(y3)

print('----------------------------------------------------')

"""
1.items- 以列表的形式的返回所有的键对值
2.values-以列表的形式返回所有的值
3.keys--以列表的形式默认返回所有的外部键
"""
z = {'姓名': 'jamin',
     '性别': '男',
     '爱好': {'爱好一': '我喜欢的任何事',
              '爱好二': '我喜欢的任何事'
              }

     }
z1 = z.items()
z2 = z.values()
z3 = z.keys()
print(z1)
print(z2)
print(z3)

print('----------------------------------------------------')

"""
1.clear-清空字典的所有的键对值
2.copy
"""
c = {'姓名': 'jamin',
     '性别': '男',
     '爱好': '我喜欢的任何事'
     }

# c.clear()
# print(c)

c1 = c.copy()
del c['姓名']
print(c)
print(c1)

print('----------------------------------------------------')

"""
1.fromkeys-创建一个新字典:
           第一个参数是一个序列(元祖/列表/集合/字符串)作为键，
           第二个参数是能写入任何数据类型(作为值)，一值两用于两个键
2.pop-从字典中移除指定键，并返回该键所对应的值（需要变量）           
"""
v = {}
v1 = v.fromkeys(['姓名', '性别'], (11, 22))
print(v1)

n = {'姓名': 'jamin',
     '性别': '男',
     '爱好': '我喜欢的任何事'
     }
n1 = n.pop('姓名')
print(n)
print(n1)

print('----------------------------------------------------')

"""
popitem-用于从列表删除最后一项(字典返回值)，并以元组的形式返回该项键值对（需要变量）
setdefault-用于设置键的默认值，若键已存在(重复)，则忽略设置(原值不变)，反之则设置键与值
"""
m = {'姓名': 'jamin',
     '性别': '男',
     '爱好': '我喜欢的任何事'
     }
# m1 = m.popitem()
# print(m)
# print(m1)
# m.setdefault('game name',  'Gracke')
# print(m)

# 若存在相同键，则返回后面那个键
# m3 = {'姓名': 'jamin',
#       '姓名': 'Gracke'
#       }
# print(m3)

print('----------------------------------------------------')

"""
update- 更新字典的键值对
       1.将b的字典更新到a的字典，若b的键与a相同，则改变'值'
       2.若a的键不存在(与b的不同),则更新a的键值对
"""
k1 = {'姓名': 'jamin',
      '性别': '男',
      '爱好': '我喜欢的任何事'
      }
k2 = {'姓名': 'Gracke',
      '性别': 'AI',
      '爱好': '我喜欢的任何事'
      }
k1.update(k2)
print(k1)

print('----------------------------------------------------')

"""字典的遍历"""
d = {'python': '网络爬虫,AI', 'java': 'web开发', 'c++': '游戏开发'}
for i in d.items():
    print(i)

# 分别获取键与值
for i, value in d.items():
    print(i, value)

print('----------------------------------------------------')
"""字典的生成式"""
import random

d = {item: random.randint(1, 100) for item in range(1, 10)}
print(d)

lst1 = ['python', 'java', 'php']
lst2 = ['1', '2', '3']
d1 = {key: value for key, value in zip(lst1, lst2)}
print(d1)
